package main

import (
	"fmt"
	"time"
)

func funcValue(a, b int, do func(int, int) int) {
	fmt.Println(do(a, b))
}

func closureSample() func() {
	count := 0
	return func() {
		count++
		fmt.Printf("调用次数 %v \n", count)
	}
}

func goFun() {
	for i := 0; i < 3; i++ {
		fmt.Printf("第 一 次 i 产生变化中 %v \n", i)
		go func() {
			fmt.Printf("第 一 次输出: %v \n", i)
		}()
	}
	time.Sleep(time.Second)
}

func goFunTmp() {
	for i := 0; i < 3; i++ {
		fmt.Printf("第 二 次 i 产生变化中 %v \n", i)
		go func(tmp int) {
			fmt.Printf("第 二 次输出: %v \n", tmp)
		}(i)
	}
	time.Sleep(time.Second)
}

func goFunTmp2() {
	for i := 0; i < 3; i++ {
		fmt.Printf("第 三 次 i 产生变化中 %v \n", i)
		tmp := i
		go func() {
			fmt.Printf("第 三 次输出：%v \n", tmp)
		}()
	}
	time.Sleep(time.Second)
}

/*
https://golang-minibear2333.github.io/2.func-containers/2-2-%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B0%E5%92%8C%E9%97%AD%E5%8C%85/#221-%E5%8C%BF%E5%90%8D%E5%87%BD%E6%95%B0
*/
func main() {

	funcValue(1, 2, func(a, b int) int {
		return a + b
	})

	funcValue(1, 2, func(a, b int) int {
		return a - b
	})

	fmt.Println(">>>>>>>>>>>>>>>")

	c1, c2 := closureSample(), closureSample()
	c1()
	c2()
	c1()
	c2()

	fmt.Println(">>>>>>>>>>>>>>>")

	goFun()

	fmt.Println(">>>>>>>>>>>>>>>")

	goFunTmp()

	fmt.Println(">>>>>>>>>>>>>>>")

	goFunTmp2()
}
